import * as Cesium from "cesium";
import * as turf from "@turf/turf";
import CesiumCrood from "./CesiumCrood";
/**
 * 封装Cesium计算方法
 * turf 是一个本地计算库，用于地理空间分析
 */
export default class CesiumCaculater {
  constructor(viewer) {
    this._coorder = new CesiumCrood(viewer); // 坐标转化方法
  }
}
/**
 * 计算左边点的球面距离
 * @param { 笛卡尔坐标数组 Cartesian3[]} positions
 * @param {* 单位：默认千米 string: degrees, radians, miles, kilometers} units
 * @returns { 米 number}
 */
CesiumCaculater.prototype.distance = function (
  positions,
  units = "kilometers"
) {
  if (positions.length > 1) {
    const pointList = this._coorder.cartesian3ToLonLatHeightArray(positions); // 转化为经纬度坐标
    const line = turf.lineString(pointList);
    const length = turf.length(line, { units: units });
    return length;
  } else {
    return 0;
  }
};

/**
 * 计算坐标点面积
 * @param { 笛卡尔坐标数组 Cartesian3[]} positions
 * @returns { 面积(平方米) number}
 */
CesiumCaculater.prototype.area = function (positions) {
  const polygon = turf.polygon(positions); // 第一个点与最后一个点为相同
  const area = turf.area(polygon);
  return area;
};

/**
 * 计算多边形中心点（质心）
 * @param { 笛卡尔坐标数组 Cartesian3[]} positions
 * @returns { 几何中心（高度为0）  Cartesian3 }
 */
CesiumCaculater.prototype.centerOfMass = function (positions) {
  console.log("positions", JSON.stringify(positions));
  const polygon = turf.polygon(positions); // 第一个点与最后一个点为相同
  const centerPoint = turf.centerOfMass(polygon);
  const coordinates = centerPoint?.geometry?.coordinates;
  // 经纬度坐标转笛卡尔坐标
  return Cesium.Cartesian3.fromDegrees(coordinates[0], coordinates[1], 0);
};

// CesiumCaculater.prototype.distance = function () {};

CesiumCaculater.prototype.CircleArea = function (pointPosition, radius) {
  const point = this._coorder.cartesian3ToLonLatHeight(pointPosition); // 转化为经纬度坐标
  // 创建一个圆
  const center = turf.point([point[0], point[1]]); // 中心点坐标
  const circle = turf.circle(center, radius / 1000, {
    steps: 6400,
    units: "kilometers", // 半径单位为公里
  });
  // 计算圆的面积
  const area = turf.area(circle); // 得到的单位是平方米
  // console.log("圆形面积", (area / 1000000).toFixed(2)); // 圆的面积（平方公里）
  return area;
};
